package Libs.Componentes.Visuais
{
  import flash.events.FocusEvent;
  import flash.events.KeyboardEvent;
  import flash.events.MouseEvent;
  import flash.ui.Keyboard;
  
  import mx.controls.DateField;
  import mx.events.FlexEvent;
  import mx.events.ValidationResultEvent;
  import mx.validators.DateValidator;
 
  [IconFile("Libs/Imagens/f.png")]
  public class DateFieldPt extends DateField 
  {
    [Bindable]
    private var
   	FDataInicial: String = 'Vazio',
    FCheckDate: Boolean = true;
       
    [Inspectable(category = "NeturionSolutions", enumeration = "Hoje,Vazio")]
    public function get DataInicial(): String 
    {
      return(FDataInicial);
    }
    
    public function set DataInicial(ADataInicial: String): void 
    {
      FDataInicial = ADataInicial;
    }
 
    [Inspectable(category = "NeturionSolutions", enumeration = "true,false", defaultValue = "true" )]
    public function get CheckDate(): Boolean
    {
      return(FCheckDate);
    }
    
    public function set CheckDate(ACheckDate: Boolean): void 
    {
      FCheckDate = ACheckDate;
    }
     
    public function DateFieldPt() 
    {
      super();
      // Legenda para os dias da semana
      dayNames = ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado'];
       
      // Formato para data
      formatString = 'DD/MM/YYYY';
       
      // Restrict usado para evitar que o usuário digite A-Z
      restrict = "0-9, /";
       
      // Tradução dos meses 
      monthNames = ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 
        'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'];
       
      // Irá permitir que o usuário digite a data
      editable = true;
      
       
      // Inicia o calendário no Domingo   
      firstDayOfWeek = 0; 
       
      // Habilita a navegação por ano.
      yearNavigationEnabled = true;  
       
      width = 100;
      
      doubleClickEnabled=true;
      buttonMode=true;
                
      /* Adicionando ao evento de focusOut o método que irá colocar
      máscara na data digitada pelo usuário */
      addEventListener(FocusEvent.FOCUS_OUT, proSetMask, false, 0, true);
       
      /* Adiciona ao evento keyDown o método para "abrir" o calendário ao pressionar Seta Para Baixo e Para Definir a Data de Hoje com o Espaço*/
      addEventListener(KeyboardEvent.KEY_DOWN, proKeyDown, false, 0, true);
      
      /* Adiciona ao evento DuploClick o método para "SetarODiaHoje"*/
      addEventListener(MouseEvent.DOUBLE_CLICK, proDuploClick, false, 0, true);
       
      // Adicina ao evento creationComplete o método que irá preencher a data
      addEventListener(FlexEvent.CREATION_COMPLETE, proDataInicial, false, 0, true);
    }
     
    private function proDataInicial(E: FlexEvent): void 
    {
      if (FDataInicial == 'Hoje')
         data = new Date();
    }
       
    private function proKeyDown(E: KeyboardEvent): void 
    {
	      // Espaço coloca a Data do Dia
	      this.selectedDate=null;
	      if(E.keyCode == 32)
	      {
	      	this.selectedDate = new Date();
	      }
	      else if(E.keyCode == Keyboard.DOWN) //seta para Baixo Abre o DateField
	      {
	      	open();
	      }
	      
    }
 	
 	private function proDuploClick(E: MouseEvent): void 
    {
      // DuploClik coloca a data do Dia
      selectedDate = new Date();
    }
 
    private function proSetMask(evFocus: FocusEvent): void 
    {
    	var dia:int;
    	var mes:int;
    	var ano:int;
	 	if((this.selectedDate == null)&&(this.text.length > 0))
	 	{
	 		  if ((text.charAt(2) != '/') || (text.charAt(5) != '/')) 
		      {
			        if (text.length <= 8)
			        {
				        dia = int(text.substr(0,2));
				        mes = int(text.substr(2,2));
				        ano = int(text.substr(4,4));
				        //se não digitou o Mes coloca o mes corrente
				        if(mes == 0)
				        {
				        	mes = new Date().month+1;//sei não porque 
				        }
				        //se não digitou o Ano coloca o ano corrente 
				        if(ano == 0)
				        {
				        	ano = new Date().fullYearUTC;
				        }
				        
				        this.text = dia.toString() + "/" + mes.toString() +"/" + ano.toString();
			        }
			        else
			        {
			        	this.text = ""; 
			        }
			        
		      }
	       
		      // Verifica se a opção para validar a data está ativa
		      if (FCheckDate)
		      {
		      		if(ChecarDataValida)//Se validou a data seta a data digitada
		      		{
		      			this.selectedDate = new Date(ano,mes-1,dia);
		      		}
		      		else
		      		{
		      			this.selectedDate = null;
		      			this.text = "";
		      		}
		      }
		      else
		      {
		      		this.selectedDate = new Date(ano,mes-1,dia);
		      }
	 	}
    }
     
    private function get ChecarDataValida():Boolean 
    {
	      var _rDateValidator: DateValidator = new DateValidator();
	         
	      _rDateValidator.source = this;
	      _rDateValidator.required = false;
	      _rDateValidator.property = 'text';
	      _rDateValidator.inputFormat = 'DD/MM/YYYY';
	      _rDateValidator.allowedFormatChars = '/-';
	      _rDateValidator.wrongDayError = 'Favor informar um dia válido para o mês.'
	      _rDateValidator.wrongLengthError = 'Favor informar a data no formato dd/mm/aaaa.'
	      _rDateValidator.wrongMonthError = 'Favor informar um mês entre 1 e 12.'
	      _rDateValidator.validate();
      
      return _rDateValidator.validate().type == ValidationResultEvent.VALID;
    }
  }
}